home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 4
/
Apprentice-Release4.iso
/
Languages
/
Caml Light 0.7
/
Caml Light 0.7 source
/
src
/
lex
/
output.ml
< prev
next >
Wrap
Text File
|
1995-06-10
|
4KB
|
80 lines
(* Generating a DFA as a set of mutually recursive functions *)
#open "syntax";;
#open "sort";;
let ic = ref std_in
and oc = ref std_out;;
(* 1- Generating the actions *)
let copy_buffer = create_string 1024;;
let copy_chunk (Location(start,stop)) =
let rec copy s =
if s <= 0 then () else
let n = if s < 1024 then s else 1024 in
let m = input !ic copy_buffer 0 n in
output !oc copy_buffer 0 m;
copy (s - m)
in
seek_in !ic start;
copy (stop - start)
;;
let output_action (i,act) =
output_string !oc ("action_" ^ string_of_int i ^ " lexbuf = (\n");
copy_chunk act;
output_string !oc ")\nand ";
()
;;
(* 2- Generating the states *)
let states = ref ([||] : automata vect);;
let enumerate_vect v =
let rec enum env pos =
if pos >= vect_length v then env else
try
let pl = assoc v.(pos) env in
pl := pos :: !pl; enum env (succ pos)
with Not_found ->
enum ((v.(pos), ref [pos]) :: env) (succ pos) in
sort
(fun (e1, ref pl1) (e2, ref pl2) -> list_length pl1 >= list_length pl2)
(enum [] 0)
;;
let output_move = function
Backtrack ->
output_string !oc "backtrack lexbuf"
| Goto dest ->
match !states.(dest) with
Perform act_num ->
output_string !oc ("action_" ^ string_of_int act_num ^ " lexbuf")
| _ ->
output_string !oc ("state_" ^ string_of_int dest ^ " lexbuf")
;;
(* This is not char_for_read because of newlines on cross-compilers *)
let escape_char = function
`\`` -> "\\`"
| `\\` -> "\\\\"
| `\t` -> "\\t"
| c -> if is_printable c then
make_string 1 c
else begin
let n = int_of_char c in
let s = create_string 4 in
set_nth_char s 0 `\\`;
set_nth_char s 1 (char_of_int (48 + n / 100));
set_nth_char s 2 (char_of_int (48 + (n / 10) mod 10));
set_nth_char s 3 (char_of_int (48 + n mod 10));
s
end
;;
let rec output_chars = function
[] ->